<?php

/**
 * Description of AproboMenosDel40PorCientoPeriodoAnterior
 *
 * @author JeyDotC
 */
class AproboMenosDel40PorCientoPeriodoAnterior extends UnderscorePlugin {

    public function aroundModuleQuitarCurso(CursoPk $cursopk) {
        return $this->checkConstraint();
    }

    public function aroundModuleGuardarCurso(Cursos $curso) {
        return $this->checkConstraint();
    }

    protected function checkConstraint() {
        $willExecute = $this->willExecute($this->baseObject);
        if (!$willExecute) {
            $module->addMessage(new Message("<p>Debes haber aprobado por lo menos el 40% de los cr&eacute;ditos del semestre anterior para poder hacer cambios en tu matr&iacute;cula.</p>", "En prueba acad&eacute;mica: ", Message::ERROR));
        }
        
        return $willExecute;
    }

    protected function willExecute(MatriculaAcademica $module) {
        Loader::using("ext::libs::AcawebUtils");

        $codigoEstudiante = ModulesContext::instance()->getCurrentUser()->getName();
        $execute = true;

        $periodo = $this->getPreviousPeriod(AcawebUtils::GetPeriodoAcademicoMatriculas());
        $cursosMatriculados = $module->model->registeredCourse->GetByEstudianteAndPeriodoAcademico($codigoEstudiante, $periodo);

        $aprobados = 0;
        $totales = 0;

        foreach ($cursosMatriculados as /* @var $cursoMatriculado CursosMatriculados */$cursoMatriculado) {
            $totales += $cursoMatriculado->getCurso()->getCreditos();
            if ($cursoMatriculado->getNotaDefinitiva() >= 3) {
                $aprobados += $cursoMatriculado->getCurso()->getCreditos();
            }
        }

        if (($aprobados / $totales) < 0.4) {
            $execute = false;
        }

        return $execute;
    }

    private function getPreviousPeriod(PeriodoAcademico $period) {
        if ($period->getPeriodo() > 1) {
            $period->setPeriodo($period->getPeriodo() - 1);
        } else {
            $period->setAno($period->getAno() - 1);
            $period->setPeriodo(2);
        }

        return $period;
    }

}

?>
